//
//  PersistenceCommon.m
//  SmartiOSPublisher
//
//  Created by Liu,Qingcan on 2017/4/25.
//  Copyright © 2017年 Baidu. All rights reserved.
//

#import "PersistenceCommon.h"


@interface PersistenceCommon()

@end

@implementation PersistenceCommon

+ (instancetype)shareInstance{
    static PersistenceCommon *singleTon = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleTon = [[PersistenceCommon alloc]init];
        singleTon.currentContext = [singleTon getManagerContext];
    });
    return singleTon;
}



- (NSManagedObjectContext *)getManagerContext{
    //构建路径,获取到沙盒里的Documents路径
    
    NSURL *documentURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    
    
    //打印沙盒路径，方便后面查看
    
    NSLog(@"沙盒路径：%@",documentURL);
    
    //经过编译后数据模型文件的扩展名由xcdatamodeld变成了momd
    
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"LiveEducation"withExtension:@"momd"];
    
    //构建CoreData的模型文件，就是Model.xcdatamodeld的模型
    
    NSManagedObjectModel *managedModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    //通过模型文件创建PersistentStoreCoordinator对象，
    
    NSPersistentStoreCoordinator *persistStore = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedModel];
    
    //构造数据库存储路径URL
    
    NSURL *persistStoreURL = [documentURL URLByAppendingPathComponent:@"LiveEducation.sqlite"];
    
    
    //创建失败
    NSError *error = nil;
    if (persistStore == nil) { // 直接抛异常
        [NSException raise:@"添加数据库错误" format:@"%@", [error localizedDescription]];
    }
    //设置persistStore的持久化存储方式为SQLiteStoreType,代表persistStore会自动生成一个SQLite数据库文件来实现持久化存储，并会自动生成SQL语句来做CRUD（增删改查）
    
    [persistStore addPersistentStoreWithType:NSSQLiteStoreType
                               configuration:nil
                                         URL:persistStoreURL
                                     options:nil
                                       error:nil];
    
    
    
    //NSManagedObjectContext:所有的ManagedObject的CRUD都是在context上进行的。
    
    //NSMainQueueConcurrencyType:这个context所关联的控制器和UI控件只能在主线程中使用
    
    // 初始化上下文，设置persistentStoreCoordinator属性
    NSManagedObjectContext *managerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
    //建立persistStore和context的关联
    [managerContext setPersistentStoreCoordinator:persistStore];
    
    return managerContext;
}





- (void)getDatas{
//    //构建路径,获取到沙盒里的Documents路径
//    
//    NSURL *documentURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
//    
//    
//    //打印沙盒路径，方便后面查看
//    
//    NSLog(@"沙盒路径：%@",documentURL);
//    
//    //经过编译后数据模型文件的扩展名由xcdatamodeld变成了momd
//    
//    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"LiveEducation"withExtension:@"momd"];
//    
//    //构建CoreData的模型文件，就是Model.xcdatamodeld的模型
//    
//    NSManagedObjectModel *managedModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
//    
//    //通过模型文件创建PersistentStoreCoordinator对象，
//    
//    NSPersistentStoreCoordinator *persistStore = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedModel];
//    
//    //构造数据库存储路径URL
//    
//    NSURL *persistStoreURL = [documentURL URLByAppendingPathComponent:@"LiveEducation.sqlite"];
//    
//    
//    //创建失败
//    NSError *error = nil;
//    if (persistStore == nil) { // 直接抛异常
//        [NSException raise:@"添加数据库错误" format:@"%@", [error localizedDescription]];
//    }
//    //设置persistStore的持久化存储方式为SQLiteStoreType,代表persistStore会自动生成一个SQLite数据库文件来实现持久化存储，并会自动生成SQL语句来做CRUD（增删改查）
//    
//    [persistStore addPersistentStoreWithType:NSSQLiteStoreType
//                               configuration:nil
//                                         URL:persistStoreURL
//                                     options:nil
//                                       error:nil];
//   
//
//    
//    //NSManagedObjectContext:所有的ManagedObject的CRUD都是在context上进行的。
//    
//    //NSMainQueueConcurrencyType:这个context所关联的控制器和UI控件只能在主线程中使用
//    
//    // 初始化上下文，设置persistentStoreCoordinator属性
//    NSManagedObjectContext *managerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//    
//    //建立persistStore和context的关联
//    [managerContext setPersistentStoreCoordinator:persistStore];
    
//    //创建需要保存的对象personOne
//    
//    NSManagedObject *userOne = [NSEntityDescription insertNewObjectForEntityForName:@"User"inManagedObjectContext:managerContext];
//    
//    //设置personOne的属性，这里personOne和我们平常用的person实例有一点区别，它无法通过点语法直接拿到属性（后面有解决方法），只能通过KVC来设置它的属性
//    
//    [userOne setValue:@"2222" forKey:@"userpwd"];
//    
//    [userOne setValue:@"from core data" forKey:@"username"];
//    
//    // 利用上下文对象，将数据同步到持久化存储库
//    NSError *errors = nil;
//    //保存数据
//    BOOL success =[managerContext save:&errors];
//    
//    if (!success) {
//        [NSException raise:@"数据库访问错误" format:@"%@",[error localizedDescription]];
//    }
//    // 如果是想做更新操作：只要在更改了实体对象的属性后调用[context save:&error]，就能将更改的数据同步到数据库 
//    
//    //保存数据
////    if([managerContext save:nil])
////        
////    {
////        
////        NSLog(@"保存数据成功");
////        
////    }

}

@end
